home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / net / mac / atalk.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  5.8 KB  |  250 lines

  1. #include "sock.hpp"
  2. #include "dprint.hpp"
  3. //#define dprintf printf
  4.  
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <AppleTalk.h>
  8. #include <ADSP.h>
  9.  
  10. #include "isllist.hpp"
  11.  
  12. #define MAXSOCKS 30
  13. #define QSIZE 1024
  14.  
  15. class atalk_address : public net_address
  16. {
  17. public :
  18.   AddrBlock addr;
  19.  
  20.     atalk_address(short net, short node)
  21.     { 
  22.         addr.aNet = net; 
  23.         addr.aNode = node;
  24.         addr.aSocket = 0;
  25.     }
  26.   atalk_address(AddrBlock *Addr) 
  27.   {
  28.       memcpy(&addr,Addr,sizeof(addr));
  29.   }
  30.   atalk_address() {}
  31.  
  32.   virtual protocol protocol_type() const { return net_address::ATALK; }
  33.   int get_port() { return addr.aSocket; }
  34.  
  35.   virtual int equal(const net_address *who) const
  36.   {
  37.     if (who->protocol_type()==ATALK &&
  38.                 (addr.aNet == ((atalk_address *)who)->addr.aNet) &&
  39.                 (addr.aNode == ((atalk_address *)who)->addr.aNode))
  40.             return 1;
  41.     else
  42.         return 0;
  43.   }
  44.   virtual int set_port(int port)  { return addr.aSocket=port; }
  45.  
  46.   virtual void print()
  47.   {
  48.     dprintf("%d:%d:%d",addr.aNet,addr.aNode,addr.aSocket);
  49.   }
  50.   net_address *copy()  { return new atalk_address(&addr); }
  51.   void store_string(char *st, int st_length)
  52.   {
  53.     char buf[100];
  54.     sprintf(buf,"%d:%d:%d",addr.aNet,addr.aNode,addr.aSocket);
  55.     strncpy(st,buf,st_length);
  56.     st[st_length-1]=0;    
  57.   }
  58. };
  59.  
  60. class atalk_base : public net_socket
  61. {
  62. protected:
  63.   int num;
  64.   int select_flags;
  65. public:
  66.     int select_count()
  67.     {
  68.         return ( ((select_flags&1 && ready_to_read())? 1 : 0)
  69.                      + ((select_flags&2 && ready_to_write())? 1 : 0) );
  70.     }
  71.  
  72.   atalk_base(int fd);
  73.   virtual ~atalk_base();
  74.  
  75.   virtual void read_selectable() { select_flags |= 1; }
  76.   virtual void read_unselectable() { select_flags &= ~1; }
  77.   virtual void write_selectable() { select_flags |= 2; }
  78.   virtual void write_unselectable() { select_flags &= ~2; }
  79.   
  80.   int get_fd() { return num; }  
  81. };
  82.  
  83. class adsp_listener;
  84. class atalk_protocol;
  85.  
  86. class adsp_socket : public atalk_base
  87. {
  88.     friend adsp_listener;
  89. private:
  90.     TRCCB    ccb;
  91. protected:
  92.     DSPParamBlock    dsp;
  93.     char send_queue[QSIZE];
  94.     char recv_queue[QSIZE];
  95.     char attn_buff[attnBufSize];
  96.     short    conn;
  97. public :
  98.   adsp_socket(int fd);
  99.     int open(atalk_address *addr);
  100.     void cleanup();
  101.     virtual ~adsp_socket() { cleanup(); }
  102.  
  103.   virtual int error();
  104.   virtual int ready_to_read();
  105.   virtual int ready_to_write();                  
  106.  
  107.   virtual int read(void *buf, int size, net_address **addr);
  108.   virtual int write(void *buf, int size, net_address *addr=NULL);
  109. };
  110.  
  111. class adsp_listener : public atalk_base
  112. {
  113.     friend atalk_protocol;
  114. private:
  115.     TRCCB    ccb;
  116. protected:
  117.     DSPParamBlock    dsp;
  118.     short    conn;
  119.     int listening;
  120. public:
  121.   adsp_listener(int fd);
  122.     void cleanup();
  123.     virtual ~adsp_listener() { cleanup(); }
  124.  
  125.   virtual int error() { return 0; }
  126.   virtual int ready_to_read();
  127.   virtual int ready_to_write() { return 0; }
  128.  
  129.   virtual int listen(int port);
  130.   virtual net_socket *accept(net_address *&addr);
  131.  
  132.   virtual void write_selectable() { return; }
  133.   virtual void write_unselectable() { return; }
  134.  
  135.   virtual int read(void *buf, int size, net_address **addr) { return 0; }
  136.   virtual int write(void *buf, int size, net_address *addr=NULL) { return 0; }
  137. };
  138.  
  139. class ddp_socket : public atalk_base
  140. {
  141. protected:
  142.     ATDDPRec ddp;
  143.     char buffer[602 + 20 + 602*16];
  144.     short socket;
  145.  
  146.     struct sPacket
  147.     {
  148.         long Count;
  149.         AddrBlock Addr;
  150.         long Data;
  151.     };
  152.     struct sDDPBuff
  153.     {
  154.         struct sPacket *Start,*End,*Head,*Tail;
  155.         long Count;
  156.         long Data;
  157.     };
  158. public :
  159.  
  160.     AddrBlock def_addr;
  161.     short get_socket() const { return socket; }
  162.  
  163.   ddp_socket(int fd);
  164.     void cleanup();
  165.   virtual ~ddp_socket() { cleanup(); }
  166.  
  167.   virtual int error();
  168.   virtual int ready_to_read();
  169.   virtual int ready_to_write() { return 1; }
  170.  
  171.   virtual int read(void *buf, int size, net_address **addr);
  172.   virtual int write(void *buf, int size, net_address *addr=NULL);
  173. };
  174.  
  175. class atalk_protocol : public net_protocol
  176. {
  177.     friend adsp_listener;
  178.     friend ddp_socket;
  179.     
  180. protected:
  181.     MPPParamBlock mpp,nbp;
  182.     NamesTableEntry    NTEName;
  183.     Str32 Name;
  184.     atalk_base *socket[MAXSOCKS];
  185.     int usage[MAXSOCKS];
  186.     int free;
  187.     int ok;    
  188.     short listener;
  189.     int registered;
  190.     int querying;
  191.     char Buff[(586+2)*10 + 20];
  192.     
  193.     // Zone information
  194.     enum { MAXZONENAMES = 1024 };
  195.     struct sZoneBlock
  196.     {
  197.         char Name[1024];
  198.     };
  199.     typedef isllist<sZoneBlock*>::iterator p_zoneblock;
  200.     isllist<sZoneBlock*> zones;
  201.     char *(ZoneName[MAXZONENAMES]);
  202.     long last_pos;
  203.     sZoneBlock *last_block;
  204.     int num_zones;
  205.     Str255 MyZone;
  206.     
  207.   // Request Data
  208.   struct RequestItem
  209.   {
  210.       atalk_address *addr;
  211.       char name[256];   //name
  212.   };
  213.   typedef isllist<RequestItem *>::iterator p_request;
  214.   isllist<RequestItem*> servers,returned;
  215. public :
  216.     int new_socket();
  217.     void free_socket(int num);
  218.  
  219.   atalk_protocol();
  220.   virtual ~atalk_protocol() { cleanup(); }
  221.  
  222.   net_address *get_local_address();
  223.   net_address *get_node_address(char *&server_name, int def_port, int force_port);
  224.   net_socket *connect_to_server(net_address *addr, 
  225.                 net_socket::socket_type sock_type=net_socket::SOCKET_SECURE);
  226.   net_socket *create_listen_socket(int &port, net_socket::socket_type sock_type);
  227.   int installed() { return ok; }
  228.   char *name() { return "AppleTalk"; }
  229.   void cleanup();
  230.   int select(int block);          // return # of sockets available for read & writing
  231.  
  232.   // Notification methods
  233.   virtual net_socket *start_notify(int port, void *data, int len);
  234.   virtual void end_notify();
  235.  
  236.   // Find notifiers methods
  237.   virtual net_address *find_address(int port, char *name);   // name should be a 256 byte buffer
  238.   virtual void reset_find_list();
  239.   
  240.   // Specialized Zone stuff
  241.   char **GetZones(int &num);
  242.   int GetMyZone(char *);
  243.   void SetZone(char *);
  244.   void AddZone(unsigned char *name);   // pascal string
  245.   void FreeZones();
  246. };
  247.  
  248. extern atalk_protocol atalk;
  249.  
  250.